// 假设已正确导入相关库和api
import { ref } from 'vue';
import { defineStore } from 'pinia'

import { apiGetPageButtons, apiGetPageInfo } from '@/api/common';
import LocalCache from '@/utils/cache';
import piniaPersistConfig from './piniaPersist'


export const usePageStore = defineStore('page', {
  state: () => ({
      buttonsList: [] , // 页面所有按钮 -- 换成map结构存储，页面key
      btnsObj: {}, // 页面所有按钮
      allRouters: [] , // 所有权限路由
      pageInfo: [1,2,3],  // 页面基本信息
      loading: ref(false),
      cacheListObj: [] , // 页面缓存数据
    }),
    getters: {},
    actions: {
      fetchInitialData(pageEname: string, cacheList: string[]) {
          this.loading = true;
          console.log('---------------111-1', pageEname, cacheList)
          return Promise.all([
            apiGetPageInfo({ formEname: pageEname }),
            apiGetPageButtons({ pageEname: pageEname }),
            // apiUserAuthRouters({}),
            ...cacheList.map(item => LocalCache.getCache(item).then(value => ({ cacheId: item, cacheValue: value }))),
          ]).then(([pageInfoRes, buttonsRes, routersRes, ...caches]) => {
            this.pageInfo = pageInfoRes.data.success ? pageInfoRes.data.data : null;
            const currentBtns = buttonsRes.data.success ? buttonsRes.data.data : {};

            const prefix = pageEname + ':';
            // 添加前缀
            const prefixedObject = addPrefixToObjectKeys(currentBtns, prefix);
            // 删除this.btnsObj中前缀为 pageEname+':'的值
            // 使用 Object.fromEntries 和 Array.prototype.filter 来移除特定前缀的属性
            this.btnsObj = Object.fromEntries(
              Object.entries(this.btnsObj).filter(([key]) => !key.startsWith(prefix))
            );
            console.log('btnsObj----', this.btnsObj)
            this.btnsObj = {...this.btnsObj, ...prefixedObject}
            this.$patch({ btnsObj: this.btnsObj }); // 使用$patch确保状态变更被追踪
          
            // this.allRouters = routersRes.data.success ? routersRes.data.data : [];
          //   this.cacheListObj = caches as CacheItem[];
          }).finally(() => {
            this.loading = false;
          });
        }
    },
    persist: piniaPersistConfig('page'),
  });
  function addPrefixToObjectKeys(obj, prefix) {
    // 使用 Object.keys 获取原对象的所有键名
    return Object.keys(obj).reduce((newObj, key) => {
      // 对每个键名添加前缀，并将键值对加入新对象
      newObj[prefix + key] = obj[key];
      return newObj;
    }, {});
  }
    // const initButtonsData = (additionalList: any) => {
    //   // 假设ButtonList类型中的每个元素都有一个uniqueId属性用于去重
    //   const uniqueIds = new Set([...this.buttonsList.map(button => button.uniqueId), ...additionalList.map(button => button.uniqueId)]);
    //   // 重新构造一个数组，包含所有具有唯一uniqueId的按钮
    //   const mergedList = [...uniqueIds].map(id => 
    //     [...this.buttonsList, ...additionalList].find(button => button.uniqueId === id)
    //   ).filter(Boolean); // 过滤掉可能的undefined项（如果uniqueId未在其中一个数组中找到）
    
    //   this.buttonsList = mergedList;
    // };
    // const getCacheList = (cacheList) => {
    //   const arr = [] 
    //   Array.isArray(cacheList)&& cacheList.forEach(item=> {
    //     const obj = {
    //       cacheId: item,
    //       value: LocalCache.getCache(item)
    //     }
    //     arr.push(obj)
    //   })
    //   return arr
    // }